﻿using System;
using System.Windows.Forms;
using CRC.GestionSalones.Controladores;
using CRC.Comun.Presentacion;
using System.Collections.Generic;

namespace CRC.GestionSalones.Presentacion
{
    public partial class AltaSalon : FormSalon, EscuchadorDeListado
    {
        private ControladorAltaSalon cas = new ControladorAltaSalon();

        public AltaSalon() : base()
        {
            InitializeComponent();

            try 
            { 
                this.cmbProvincia.SetData(cas.todasProvincias()); //Llenar provincias
                this.cmbZona.SetData(cas.todasZonas()); //Llenar zonas
                this.cmbPropiedad.SetData(cas.todosTipoPropietario()); //Llenar tipo propiedad
            }
            catch(Exception ex){

                MessageBox.Show(
                    ex.Message, "Error", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error
                );
            }
           
            listaAsistentes.Visible = false;
            butAlta.Visible = false;
            butModificar.Visible = false;
            butEliminar.Visible = false;
        }

        private void butNext_Click(object sender, EventArgs e)
        {

            if (txtNumProyecto.Text.Length == 0 ||
                    txtNombre.Text.Trim().Length == 0 ||
                    txtDireccion.Text.Trim().Length == 0 ||
                    cmbZona.SelectedIndex == -1 ||
                    cmbPropiedad.SelectedIndex == -1 ||
                    cmbMunicipio.SelectedIndex == -1)
            {
                MessageBox.Show(
                    "Faltan campos obligatorios por cumplimentar", "Advertencia", 
                    MessageBoxButtons.OK, MessageBoxIcon.Warning
                );
            } 
            else 
            {
                
                try
                {
                    int? intMunicipio = null, intProvincia = null, intTelefono = null;

                    if (txtCPostal.Text.Trim().Length > 0 && !txtCPostal.MaskFull)
                    {
                        MessageBox.Show(
                            "Código postal incorrecto.", "Advertencia",
                            MessageBoxButtons.OK, MessageBoxIcon.Warning
                        );

                        txtCPostal.Focus();
                        txtCPostal.SelectAll();
                    }
                    else 
                    {
                        if (cmbProvincia.SelectedKey != null) intProvincia = (int)cmbProvincia.SelectedKey;
                        if (cmbMunicipio.SelectedKey != null) intMunicipio = (int)cmbMunicipio.SelectedKey;
                        if (!String.IsNullOrEmpty(txtTelefono.Text.Trim())) intTelefono = int.Parse(txtTelefono.Text.Trim().Replace(" ", ""));

                            cas.nuevoSalon(
                                txtNumProyecto.Text.Trim(), 
                                txtNombre.Text.Trim(),
                                intProvincia, 
                                intMunicipio, 
                                (int)cmbZona.SelectedKey, 
                                txtDireccion.Text.Trim(),
                                txtCPostal.Text.Trim(), 
                                txtCoordenadaAltitud.Text.Trim(), 
                                txtCoordenadaLatitud.Text.Trim(),
                                intTelefono, 
                                txtObservaciones.Text.Trim(),
                                (String)cmbPropiedad.SelectedKey
                           );

                    Button thisButton = (Button)sender;
                    thisButton.Enabled = false;
                    this.butOK.Enabled = true;

                    txtCoordenadaAltitud.Enabled = false;
                    txtCoordenadaLatitud.Enabled = false;
                    txtCPostal.Enabled = false;
                    txtDireccion.Enabled = false;
                    txtNombre.Enabled = false;
                    txtNumProyecto.Enabled = false;
                    txtObservaciones.Enabled = false;
                    txtTelefono.Enabled = false;
                    cmbMunicipio.Enabled = false;
                    cmbProvincia.Enabled = false;
                    cmbZona.Enabled = false;
                    cmbPropiedad.Enabled = false;

                    lblAñadeAsistentes.Visible = true;
                    listaAsistentes.Visible = true;
                    butAlta.Visible = true;
                    butModificar.Visible = true;
                    butEliminar.Visible = true;

                    }
                }
                catch (ApplicationException aEx)
                {
                    MessageBox.Show(
                        aEx.Message, 
                        "Advertencia", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Warning, 
                        MessageBoxDefaultButton.Button1
                    );
                }
                catch (Exception ex) 
                {
                    MessageBox.Show(
                            ex.Message,
                            "Error",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error,
                            MessageBoxDefaultButton.Button1
                     );
                }
            }
        }

        private void cmbProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbProvincia.SelectedIndex != -1) {
                this.cmbMunicipio.SetData(cas.municipiosDeProvincia((int)cmbProvincia.SelectedKey));
            }
        }

        protected override void butAlta_Click(object sender, EventArgs e)
        {

            AltaCongregacion altaCongregacion = new AltaCongregacion(this.cas);
            this.panel1.Controls.Add(altaCongregacion);
            altaCongregacion.Dock = DockStyle.Fill;
            altaCongregacion.añadirEscuchadorDeListado(this);
            altaCongregacion.BringToFront();

        }

        protected override void butModificar_Click(object sender, EventArgs e)
        {
            String nCongrSeleccionada = (String)listaAsistentes.SelectedRows[0].Cells["NOMBRE"].Value;
            ModificarCongregacion modificarCongregacion = new ModificarCongregacion(this.cas, nCongrSeleccionada);
            this.panel1.Controls.Add(modificarCongregacion);
            modificarCongregacion.Dock = DockStyle.Fill;
            modificarCongregacion.añadirEscuchadorDeListado(this);
            modificarCongregacion.BringToFront();
        }

        protected override void butEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Estás seguro de querer eliminar la congregación seleccionada?", "Confirmación",
                MessageBoxButtons.YesNo , MessageBoxIcon.Question) == DialogResult.Yes)
            {
                String nCongrSeleccionada = (String)listaAsistentes.SelectedRows[0].Cells["NOMBRE"].Value;
                this.cas.eliminarCongregacion(nCongrSeleccionada);
                listaAsistentes.Rows.Remove(listaAsistentes.SelectedRows[0]);
            }
        }

        private void butOK_Click(object sender, EventArgs e)
        {
            // post: Sino se ha indicado la congregacion anfitriona o hay mas de una -> mostrar mensaje
            int nAnfittrionas = 0;

            for (int i = 0; i < listaAsistentes.Rows.Count; i++)
            {
                if ((Boolean)listaAsistentes.Rows[i].Cells["ANFITRIONA"].Value)
                    nAnfittrionas++;
            }

            if (nAnfittrionas != 1)
            {
                MessageBox.Show(
                    "Indica una, y solo una, congregación anfitriona.", "Advertencia",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning
                );
            }
            else
            {
                try
                {
                    int intSalon = cas.FinAltaSalon();
                    foreach (EscuchadorDeListado esc in base.escuchadoresDeListado) 
                    {
                        esc.notificarCambio(
                            this,
                            "añadir.salon",
                            new Object[] { 
                                intSalon,
                                txtNumProyecto.Text.Trim(), 
                                txtNombre.Text.Trim(),
                                txtTelefono.Text, 
                                txtDireccion.Text.Trim(), 
                                txtCPostal.Text.Trim(), 
                                cmbPropiedad.SelectedItem
                            }
                        );
                    }

                    this.Dispose();
                }
                catch (Exception ex) {

                    MessageBox.Show(
                        ex.Message, "Error", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error
                    );
                }
            }
        }

        private void butKO_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        #region Miembros de EscuchadorDeListado

        public void notificarCambio(object pSender, string pStrAccion, object pObjValor)
        {
            Object[] valor = (Object[])pObjValor;

            if (pStrAccion.Equals("añadir.congregacion")) 
            {
                listaAsistentes.Rows.Add(valor);
            }
            else if (pStrAccion.Equals("modificar.congregacion")) 
            {
                foreach(DataGridViewRow aRow in listaAsistentes.Rows)
                {
                    if (((String)aRow.Cells["NOMBRE"].Value).CompareTo((String)valor[1]) == 0)
                        aRow.SetValues(valor);
                }
            }
        }

        #endregion

       
    }
}
